/*
 * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。[遇见知启蒙，邂逅框架梦]
 * 
 * https://zhiqim.org/project/zhiqim_framework/zhiqim_kernel.htm
 *
 * Zhiqim Kernel is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */
package org.zhiqim.kernel.util;

import org.zhiqim.kernel.annotation.AnAlias;

/**
 * 位运算工具类
 * 1.左为高，右为低
 * 2.高1位表示左边第一位=低8位
 * 
 * FF           7F          3F          1F          0F          07          03          01
 * 1111 1111    0111 1111   0011 1111   0001 1111   0000 1111   0000 0111   0000 0011   0000 0001
 *
 * @version v1.0.0 @author zouzhigang 2014-3-21 新建与整理
 */
@AnAlias("Bits")
public class Bits
{
    /**
     * 判断字节指定的位上是不是0
     * 
     * @param ib    字节
     * @param hpos  高第1-8之间
     * @return      =true表示是，=false表示否
     */
    public static boolean isZero(int ib, int hpos)
    {
        return ((ib >>> (8-hpos)) & 0x00000001) == 0;
    }
    
    /**
     * 判断字节指定的位上是不是1
     * 
     * @param ib    字节
     * @param hpos  高第1-8之间
     * @return      =true表示是，=false表示否
     */
    public static boolean isOne(int ib, int hpos)
    {
        return ((ib >>> (8-hpos)) & 0x00000001) == 1;
    }
    
    /**
     * 字节抹除高位得到的正数
     * 
     * @param ib    字节
     * @param hpos  高第1-7之间
     * @return      抹除后的正数
     */
    public static int remove(int ib, int hpos)
    {
        switch (hpos)
        {
        case 1:return ib & 0x0000007F;
        case 2:return ib & 0x0000003F;
        case 3:return ib & 0x0000001F;
        case 4:return ib & 0x0000000F;
        case 5:return ib & 0x00000007;
        case 6:return ib & 0x00000003;
        case 7:return ib & 0x00000001;
        default:throw Asserts.exception("[Bits.remove]位运算抹除高位值在1-7之间");
        }
    }
    
    /**
     * 把有符号字节转换成无符号整数
     * 
     * @param val   字节
     * @return      无符号整型
     */
    public static int unsigned(byte val)
    {
        return val & 0xFF;
    }
    
    /**
     * 把有符号的短整型转换为无符号的整型
     * 
     * @param val   短整型
     * @return      整型
     */
    public static int unsigned(short val)
    {
        return val & 0xFFFF;
    }
    
    /**
     * 把有符号的整型转换为无符号的长整型
     * 
     * @param val   整型
     * @return      长整型
     */
    public static long unsigned(int val)
    {
        return val & 0xFFFFFFFFL;
    }
    
    /**
     * 把有符号的整型转换为无符号的长整型，传入值可能已转为长整型
     * 
     * @param val   长整型
     * @return      长整型
     */
    public static long unsigned(long val)
    {
        return val & 0xFFFFFFFFL;
    }
}
